package com.example.easyexcel.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.ListUtils;
import com.example.easyexcel.entity.DemoData;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;

/**
 * 文件下载模板工具类
 */
public class FileUtil {

    /**
     * 表格方式下载
     *
     * @param response
     * @param fileName
     */
    public static void downloadExcel(HttpServletResponse response, String fileName){
        //方法一：直接下载路径下的文件模板（这种方式貌似在SpringCloud和Springboot中，打包成JAR包时，无法读取到指定路径下面的文件，不知道记错没，你们可以自己尝试下！！！）
        try {
            //文件名称
            //String fileName = "境内上市企业.xlsx";
            //设置要下载的文件的名称
            // 通知客服文件的MIME类型（方式一）
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");

//            // 方式二
//            response.setContentType("application/vnd.ms-excel");
//            response.setCharacterEncoding("utf-8");

            System.out.println(fileName);
            //获取文件
            Resource fileResource = new ClassPathResource("/excel/" + fileName);
            InputStream input = fileResource.getInputStream();

            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
            // 也有这样写的
//            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setHeader("Content-disposition", "attachment;fileName=" + fileName);

            OutputStream out = response.getOutputStream();
            byte[] b = new byte[2048];
            int len;
            while ((len = input.read(b)) != -1) {
                out.write(b, 0, len);
            }
            //修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容？如果信任此工作簿的来源，请点击"是"
            //response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));
            input.close();


        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 数据方式下载
     *
     * @param response
     * @return
     * @throws IOException
     */
    public static String downloadExcel(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        // 如果指定了ExcelProperty,那么可以不用不用指定head,到处的excel仍然含有标题，如果想要多标题，那么就需要指定
        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("第一个sheet").doWrite(data());
        return "success";
    }

    /**
     * 构建数据
     *
     * @return
     */
    private static List<DemoData> data() {
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(8.5663);
            list.add(data);
        }
        return list;
    }
}
